package com.linjuke.mayouting.web.modules.action;

import com.linjuke.mayouting.biz.ao.RoleAO;
import com.linjuke.mayouting.biz.dal.dataobject.RoleDO;
import com.linjuke.mayouting.web.common.BaseAction;
import com.zjuh.splist.core.annotation.DefaultTarget;
import com.zjuh.splist.core.form.Form;
import com.zjuh.splist.core.module.URLModule;
import com.zjuh.splist.core.module.URLModuleContainer;
import com.zjuh.splist.web.RunData;
import com.zjuh.splist.web.TemplateContext;
import com.zjuh.sweet.result.Result;

public class RoleAction extends BaseAction {
	
	private RoleAO roleAO;
	
	@DefaultTarget("role/create")
	public void doCreateRole(RunData rundata, TemplateContext templateContext) {
		if (!checkCsrf(templateContext, "createRole")) {
			return;
		}
		final Form form = rundata.getForm("role.create");
		if (!form.validate()) {
			return;
		}
		form.holdValues();
		RoleDO inputRole = new RoleDO();
		form.apply(inputRole);
		Result result = roleAO.createRole(inputRole);
		if (result.isSuccess()) {
			Integer id = (Integer)result.getModels().get("id");
			send2detail(id, rundata);
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	@DefaultTarget("role/detail")
	public void doAddPermission(RunData rundata, TemplateContext templateContext) {
		if (!checkCsrf(templateContext, "addPermission")) {
			return;
		}
		int roleId = rundata.getQueryString().getInt("roleId");
		int permissionId = rundata.getQueryString().getInt("permissionId");
		Result result = roleAO.addPermission(roleId, permissionId);
		if (result.isSuccess()) {
			this.send2detail(roleId, rundata);
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	@DefaultTarget("role/detail")
	public void doRemovePermission(RunData rundata, TemplateContext templateContext) {
		int roleId = rundata.getQueryString().getInt("roleId");
		int permissionId = rundata.getQueryString().getInt("permissionId");
		Result result = roleAO.removePermission(roleId, permissionId);
		if (result.isSuccess()) {
			this.send2detail(roleId, rundata);
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	@DefaultTarget("role/detail")
	public void doGrantUser(RunData rundata, TemplateContext templateContext) {
		int roleId = rundata.getQueryString().getInt("roleId");
		String username = rundata.getQueryString().getString("username");
		Result result = roleAO.grantUser(roleId, username);
		if (result.isSuccess()) {
			this.send2detail(roleId, rundata);
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	@DefaultTarget("role/list")
	public void doDeleteRole(RunData rundata, TemplateContext templateContext) {
		int roleId = rundata.getQueryString().getInt("roleId");
		Result result = roleAO.deleteRole(roleId);
		if (result.isSuccess()) {
			this.sendToModule("baseModule", "role/list");
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	@DefaultTarget("role/detail")
	public void doRejectUser(RunData rundata, TemplateContext templateContext) {
		int roleId = rundata.getQueryString().getInt("roleId");
		int userId = rundata.getQueryString().getInt("userId");
		
		Result result = roleAO.rejectUser(roleId, userId);
		if (result.isSuccess()) {
			this.send2detail(roleId, rundata);
		} else {
			this.handleError(result, rundata, templateContext);
		}
	}
	
	private void send2detail(Integer id, RunData rundata) {
		URLModuleContainer ct = this.getURLModuleContainer("baseModule");
		URLModule um = ct.setTarget("role/detail");
		um.add("id", id);
		rundata.sendRedirect(um.render());
	}

	public void setRoleAO(RoleAO roleAO) {
		this.roleAO = roleAO;
	}

}
